<?php
// +----------------------------------------------------------------------
// | sfadmin - Suifeng Administration
// +----------------------------------------------------------------------
// | Copyright (c) 2017-2020 http://suifeng.tech All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: suifeng <1787585212@qq.com>
// +----------------------------------------------------------------------

namespace app\common\behavior;

use think\Config;

final class Application
{
    public function run(&$params)
    {
        // 应用入口文件
        defined('APP_NAME') or define('APP_NAME', strtolower(basename($_SERVER['SCRIPT_FILENAME'], '.php')));

        // 是否是调试模式？
        defined('APP_DEBUG') or define('APP_DEBUG', \think\App::$debug);

        // 是否是开发模式？
        defined('APP_DEV_MODE') or define('APP_DEV_MODE', isset($_SERVER[ENV_PREFIX . 'DEV_MODE']) && $_SERVER[ENV_PREFIX . 'DEV_MODE'] == 'true');

        // 是否是CGI模式？
        define('IS_CGI', (0 === strpos(PHP_SAPI, 'cgi') || false !== strpos(PHP_SAPI, 'fcgi')) ? 1 : 0);

        // ROOT路径
        if (!IS_CLI) {
            // 当前文件名
            if (!defined('_PHP_FILE_')) {
                if (IS_CGI) {
                    //CGI/FASTCGI模式下
                    $_temp = explode('.php', $_SERVER['PHP_SELF']);
                    define('_PHP_FILE_', rtrim(str_replace($_SERVER['HTTP_HOST'], '', $_temp[0] . '.php'), '/'));
                } else {
                    define('_PHP_FILE_', rtrim($_SERVER['SCRIPT_NAME'], '/'));
                }
            }
            if (!defined('__ROOT__')) {
                $_root = rtrim(dirname(_PHP_FILE_), '/');
                define('__ROOT__', (('/' == $_root || '\\' == $_root) ? '' : $_root));
            }
        }


        // --------------------------------------------------------------------
        // 检查是否有安装？
        // 通过判断runtime/data/install.lock文件是否存在确定是否有安装。
        // --------------------------------------------------------------------

        // 是否有安装？
        if (!is_file(CONF_PATH . 'config' . CONF_EXT) && APP_NAME != 'install') {
            header("Location: " . __ROOT__ . '/install.php');
            exit();
        }


        // --------------------------------------------------------------------
        // 加载额外的助手文件。
        // 额外助手文件都位于application/common/includes目录。
        // --------------------------------------------------------------------

        require_once dirname(__DIR__) . '/include/constants.php';
        require_once dirname(__DIR__) . '/include/functions.php';
        require_once dirname(__DIR__) . '/include/annotations.php';


//      // --------------------------------------------------------------------
//      // 加载额外的配置文件。
//      // 额外配置文件都位于application/common/config目录。
//      // --------------------------------------------------------------------

//      // 通用配置文件
//      Config::load(APP_PATH . 'common/config/config.php');

//      // 针对不同的应用，可以有不同的配置文件
//      Config::load(APP_PATH . APP_NAME . '/config/config.php');


        // --------------------------------------------------------------------
        // 从数据库中加载配置，install时不用加载，因为数据库还没有配置好。
        // --------------------------------------------------------------------

        if (APP_NAME != 'install') {

            $db_config_data = cache('db_config_data');

            if (!$db_config_data || APP_DEBUG) {
                // 从数据库中加载配置
                $db_config_data = service('admin/config')->get_config_array();

                // 获取所有安装的模块配置
                $db_config_data['installed_modules'] = service('admin/module')->get_module_list();
                foreach ($db_config_data['installed_modules'] as $module) {
                    //$db_config_data[strtolower($module['name'] . '_config')] = $module['config'];
                    foreach ($module['config'] as $key => $value) {
                        $db_config_data[strtoupper($module['name'] . '_' . $key)] = $value;
                    }
                }

                /*
                // 获取所有安装的模块配置
                $db_config_data['installed_modules'] = array(); // 已安装模块
                $module_list = model('admin/module')->where(array('status' => '1'))->select();
                foreach ($module_list as $_module) {
                    $db_config_data[strtolower($_module['name'] . '_config')]['module_name'] = $_module['name'];
                    $db_config_data[strtolower($_module['name'] . '_config')] = json_decode($_module['config'], true);
                    $db_config_data['installed_modules'][] = $_module['name'];
                }

                // 获取所有安装的插件配置
                $db_config_data['installed_addons'] = array(); // 已安装插件
                $addon_list = model('admin/addon')->where(array('status' => '1'))->select();
                foreach ($addon_list as $_addon) {
                    $db_config_data[strtolower($_addon['name'] . '_addon_config')]['addon_name'] = $_addon['name'];
                    $db_config_data[strtolower($_addon['name'] . '_addon_config')]               = json_decode($_addon['config'], true);
                    $db_config_data['installed_addons'][] = $_addon['name'];
                }
                */

                // 缓存配置
                cache('db_config_data', $db_config_data, 3600);
            }

            config($db_config_data);
        }


        // --------------------------------------------------------------------
        // 创建模块实例。
        // 模块类在模块根目录下的module.php文件内定义。
        // --------------------------------------------------------------------

        $installed_modules = config('installed_modules');
        if ($installed_modules) {
            foreach (array_keys($installed_modules) as $module) {
                //ModuleHelper::regiserHooks($module);

                /*
                $module_file = realpath(APP_PATH . $module['name'] . '/module.php');
                if ($module_file) {
                    require_once $module_file;
                    $class_name = '\\' . \think\App::$namespace . '\\' . $module['name'] . '\\Module';
                    $module_instance = new $class_name();
                } else {
                    $module_instance = null;
                }

                $installed_modules[$module['name']]['instance'] = $module_instance;

                // 检查是否有@Hook定义
                if ($module_instance) {
                    $ref_class = new \ReflectionAnnotatedClass($module_instance);
                    foreach ($ref_class->getMethods() as $ref_method) {
                        if ($ref_method->hasAnnotation('Hook')) {
                            $hook_name = $ref_method->getAnnotation('Hook')->value;
                            if (empty($hook_name)) {
                                $hook_name = $ref_method->getName();
                            }

                            \think\Hook::add($hook_name, array($module_instance, $ref_method->getName()));
                        }
                    }
                }
                */
            }

            config('installed_modules', $installed_modules);
        }


        // --------------------------------------------------------------------
        // 视图输出字符串内容替换。
        // --------------------------------------------------------------------

        config('view_replace_str', config('view_replace_str') + [
            '__ROOT__'    => __ROOT__,
            '__STATIC__'  => __ROOT__ . '/static',
        ]);


        // --------------------------------------------------------------------
        //  SESSION与COOKIE设置不同的前缀，避免冲突。
        // --------------------------------------------------------------------

        if (in_array(APP_NAME, ['admin', 'install'])) {
            config('session.prefix', strtolower(ENV_PREFIX . APP_NAME . '_'));
            config('cookie.prefix', strtolower(ENV_PREFIX . APP_NAME . '_'));
        }


        // --------------------------------------------------------------------
        //  针对已安装的模块和插件，加载它的的标签库和扩展。
        // --------------------------------------------------------------------

        // 解析标签库，配置里面是字符串，转换成数组
        $taglib_pre_load = explode(',', config('template.taglib_pre_load'));

        $installed_modules = config('installed_modules');
        if ($installed_modules) {
            foreach (array_keys($installed_modules) as $module_name) {
                // 模块标签库
                $tag_path = APP_PATH . $module_name . '/taglib/' . $module_name . '.php';
                if (is_file($tag_path)) {
                    $taglib_pre_load[] = $module_name . '\\taglib\\' . $module_name;
                }

                // 模块行为扩展
                $bhv_path = APP_PATH . $module_name . '/behavior/' . $module_name . 'Behavior.php';
                if (is_file($bhv_path)) {
                    \think\Hook::add('sf_behavior', $module_name . '\\behavior\\' . $module_name);
                }
            }
        }

//      $installed_addons = config('installed_addons');
//      if ($installed_addons) {
//          foreach ($installed_addons as $addon_name) {
//              // 插件标签库
//              $tag_path = config('addon_path') . lcfirst($addon_name) . '/taglib/' . $addon_name . 'Addon.php';
//              if (is_file($tag_path)) {
//                  $taglib_pre_load[] = '\\addon\\' . lcfirst($addon_name) . '\\taglib\\' . $addon_name . 'Addon';
//              }

//              // 插件行为扩展
//              $bhv_path = config('addon_path') . lcfirst($addon_name) . '/behavior/' . $addon_name . 'Addon.php';
//              if (is_file($bhv_path)) {
//                  \think\Hook::add('sf_behavior', '\\addon\\' . lcfirst($_addon['name']) . '\\behavior\\' . $addon_name);
//              }
//          }
//      }

        // 格式化加载标签库
        config('template.taglib_pre_load', implode(',', $taglib_pre_load));


        // --------------------------------------------------------------------
        // 检查是否是移动端请求？
        // --------------------------------------------------------------------

        // 移动端强制后台传统视图
        if (request()->isMobile()) {
            config('is_mobile', true);
            config('admin_tabs', 0);
        } else {
            config('is_mobile', false);
        }

        // 强制WAP模式
        //if (config['WAP_MODE']) {
        //    config('is_mobile', true);
        //}


        // --------------------------------------------------------------------
        // 针对不同的应用入口，设置不同的首页。
        // --------------------------------------------------------------------

        require_once APP_PATH . 'common/init.php';

        // 输入{域名}/admin.php即可进入后台首页
        if (APP_NAME == 'admin') {
            //require_once APP_PATH . 'admin/includes/table.php';

            if (empty($_SERVER['PATH_INFO']) || $_SERVER['PATH_INFO'] == '/') {
                $_SERVER['PATH_INFO'] = config('admin_index_url');
            }
        }

        // 输入{域名}/install.php即可进入安装首页
        if (APP_NAME == 'install') {
            if (empty($_SERVER['PATH_INFO']) || $_SERVER['PATH_INFO'] == '/') {
                $_SERVER['PATH_INFO'] = '/install/index/index';
            }
        }
    }
}

